#include "Dri_Wifi.h"

#include "Com_Debug.h"
#include "esp_event.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"

#define TAG "WIFI"

extern TaskHandle_t MQTT_handle;

// 事件回调函数
void wifi_callback(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
    static uint8_t count = 0;

    if (event_base == WIFI_EVENT) {
        switch (event_id) {
        case WIFI_EVENT_STA_START:
            // 连接wifi
            ESP_LOGE(TAG, "connect wifi ...");
            esp_wifi_connect();
            break;
        case WIFI_EVENT_STA_CONNECTED:
            // 已连接
            ESP_LOGE(TAG, "connect wifi success");
            count = 0;
            break;
        case WIFI_EVENT_STA_DISCONNECTED:
            // 连接失败重连
            if (count++ < 5) {
                ESP_LOGE(TAG, "%hhu connect faild", count);
                esp_wifi_connect();
            }
            break;
        }
    }

    if (event_base == IP_EVENT) {
        switch (event_id) {
        case IP_EVENT_STA_GOT_IP: // 只有获取到路由器分配的IP，才认为是连上了路由器
            ESP_LOGE(TAG, "get ip address");

            xTaskNotifyGive(MQTT_handle); // 连接Wifi成功，开始MQTT任务
            break;
        }
    }
}

void Dri_Wifi_Init(void) {

    // 初始化 flsah
    // nvs_flash_init();

    // 用于初始化tcpip协议栈
    esp_netif_init();
    // 创建事件循环
    esp_event_loop_create_default();
    // 创建站点-使用默认配置创建STA对象
    esp_netif_create_default_wifi_sta();

    // 注册wifi、ip事件回调
    esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, wifi_callback, NULL);
    esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_callback, NULL);

    // 初始化wifi
    wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&config);
    // 设置站点模式
    esp_wifi_set_mode(WIFI_MODE_STA);

    // WIFI 设置
    wifi_config_t conf = {
        .sta = {
            .ssid = "hzd",
            .password = "huangzhidong123"}};
    esp_wifi_set_config(ESP_IF_WIFI_STA, &conf);

    esp_wifi_start();
}
